<?php

/** 
 * @author felipe
 * 
 * 
 */
class App_Model_Db_Distribuicao extends Voitech_Db{

        protected $_name = 'distribuicao';
	protected $_primary = 'co_distribuicao';
	
	static private $instancia;

	/**
	 * @return App_Model_Db_Distribuicao
	 */
	static public function build() {
		if( !isset( self::$instancia ) ) {
			$classe = __CLASS__;
			self::$instancia = new $classe();
		}
		return self::$instancia;
	}

        /**
	 * Metodo que busca uma distribuicao pelo id
	 *
	 * @param int coDistribuicao
	 * @return array
	 */
	public function buscardistribuicao($coDistribuicao) {
		$obSelect = $this->getAdapter()->select()
		                               ->distinct()
		                               ->from(array('distribuicao'=>'distribuicao'))
		                               ->joinInner('unidade'
		                               			  ,'unidade.co_unidade = distribuicao.co_unidade'
		                               			  ,array('no_unidade'
		                               			        ,'ds_endereco'
                                                                        ,'nu_telefone'
                                                                        ,'co_responsavel'))
		                               ->joinInner(array('responsavel'=>'pessoa')
		                               			  ,'responsavel.co_pessoa = unidade.co_responsavel'
		                               			  ,array('no_responsavel'=>'no_pessoa'
		                               			        ,'nu_cpf_responsavel'=>'nu_cpf'))
		                               ->joinInner(array('usuario'=>'pessoa')
		                               			  ,'usuario.co_pessoa = distribuicao.co_pessoa'
		                               			  ,array('co_usuario'=>'co_pessoa'
                                                                        ,'no_usuario'=>'no_pessoa'
		                               			        ,'nu_cpf_usuario'=>'nu_cpf'))
		                               ->where('distribuicao.co_distribuicao = ?', $coDistribuicao);
		return $this->getAdapter()->fetchRow($obSelect);
	}

        /**
	 * Metodo que lista os dados para o objeto distribuicao
	 * @param $obTO
	 */
	public function listarTodos( Voitech_TO $obTO ) {
		$obSelect = $this->getAdapter()->select()
		                               ->distinct()
		                               ->from(array('distribuicao'=>'distribuicao'))
		                               ->joinInner('unidade'
		                               			  ,'unidade.co_unidade = distribuicao.co_unidade'
		                               			  ,array('no_unidade'
		                               			        ,'ds_endereco'
		                               			        ,'co_tipo_unidade'
                                                                        ,'nu_telefone'
                                                                        ,'co_responsavel'))
		                               ->joinInner(array('responsavel'=>'pessoa')
		                               			  ,'responsavel.co_pessoa = unidade.co_responsavel'
		                               			  ,array('no_responsavel'=>'no_pessoa'
		                               			        ,'nu_cpf_responsavel'=>'nu_cpf'))
		                               ->joinInner(array('usuario'=>'pessoa')
		                               			  ,'usuario.co_pessoa = distribuicao.co_pessoa'
		                               			  ,array('co_usuario'=>'co_pessoa'
                                                                        ,'no_usuario'=>'no_pessoa'
		                               			        ,'nu_cpf_usuario'=>'nu_cpf'));
		if( !empty( $obTO->co_distribuicao ) ) {
			$obSelect->where('distribuicao.co_distribuicao = ?',$obTO->co_distribuicao);
		}

		if( !empty( $obTO->co_unidade ) ) {
			$obSelect->where('distribuicao.co_unidade = ?',$obTO->co_unidade);
		}

		if( !empty( $obTO->dt_inicio )) {
                    $obSelect->where("distribuicao.dt_cadastro >= '" . $obTO->dt_inicio."'");
		}
                
                if( !empty( $obTO->dt_final ) ) {
                    $obSelect->where("distribuicao.dt_cadastro <= '".$obTO->dt_final."'");
		}
                if( isset($obTO->order) and !empty($obTO->order) ){
                    $obSelect->order($obTO->order);
                }

                if( isset($obTO->limit) and !empty($obTO->limit) ){
                    $obSelect->limit($obTO->limit);
                }
                
		return $this->getAdapter()->fetchAll( $obSelect );
	}
        
        public function listarRelatorioDistribuicao(Voitech_TO $obTO){
            
            $obSubSelect = $this->getAdapter()->select()
                                              ->from('distribuicao',array('co_distribuicao'))
                                              ->columns(array("item_distribuicao.co_produto"
                                                             ,"total_solicitado"=>new Zend_Db_Expr("sum(item_distribuicao.nu_quantidade_solicitada)")
                                                             ,"total_atendido"=>new Zend_Db_Expr("sum(item_distribuicao.nu_quantidade_atendida)")))
                                              ->joinInner('item_distribuicao', "item_distribuicao.co_distribuicao = distribuicao.co_distribuicao",'');
            if( isset($obTO->dt_inicio) and !empty($obTO->dt_inicio) ){
                $obSubSelect->where('distribuicao.dt_cadastro >?',$obTO->dt_inicio);
            }
            
            if( isset($obTO->dt_final) and !empty($obTO->dt_final) ){
                $obSubSelect->where('distribuicao.dt_cadastro <?',$obTO->dt_final);
            }
            
            if( isset($obTO->co_unidade) and !empty($obTO->co_unidade) ){
                $obSubSelect->where('distribuicao.co_unidade =?',$obTO->co_unidade);
            }
            
            $obSubSelect->group("item_distribuicao.co_produto");
            
            $obSelect = $this->getAdapter()->select()
                                           ->distinct()
                                           ->from('produto',array('co_produto','no_produto' ))
                                           ->columns(array('nu_total_solicitado'=>new Zend_Db_Expr("(sum(item_distribuicao.total_solicitado))") 
                                                          ,'nu_total_atendido'=>new Zend_Db_Expr("(sum(item_distribuicao.total_atendido))"
                                                          )))
                                           ->joinInner(array('item_distribuicao'=>$obSubSelect)
                                                      ,"item_distribuicao.co_produto = produto.co_produto"
                                                      ,"");
            if( isset($obTO->co_produto) and !empty($obTO->co_produto) ){
                $obSelect->where('produto.co_produto =?',$obTO->co_produto);
            }
            
            if( isset($obTO->limit) and !empty($obTO->limit) ){
                $obSelect->limit($obTO->limit);
            }
            
            $obSelect->group("produto.co_produto");
            
            return $this->getAdapter()->fetchAll($obSelect);
        }
        
        
        public function listarRelatorioTipoProdutoDistribuicao(Voitech_TO $obTO){
            
            $obSelect = $this->getAdapter()->select()
                                              ->from(array('produto'=>'produto'))
                                              ->columns(array("co_produto"=>"produto.co_produto"
                                                             ,"co_tipo_produto"=>"produto.co_tipo_produto"
                                                             ,"co_categoria"=>"produto.co_categoria"
                                                             ,"no_tipo_produto"=>"tipo_produto.no_tipo_produto"
                                                             ,"no_produto"=>"produto.no_produto"
                                                             ,"no_categoria"=>"categoria.no_categoria"
                                                             ,"nu_quantidade_produto"=>"item_distribuicao.nu_quantidade_atendida"
                                                             ,"dt_cadastro"=>"distribuicao.dt_cadastro"
                                                             ))
                                              ->joinInner('tipo_produto', "produto.co_tipo_produto = tipo_produto.co_tipo_produto",'') 
                                              ->joinInner('item_distribuicao', "item_distribuicao.co_produto = produto.co_produto",'')
                                              ->joinInner('categoria', "produto.co_categoria = categoria.co_categoria",'')              
                                              ->joinInner('distribuicao', "item_distribuicao.co_distribuicao = distribuicao.co_distribuicao",'');
                                              
            if( isset($obTO->dt_inicio) and !empty($obTO->dt_inicio) ){
                $obSelect->where('distribuicao.dt_cadastro >?',$obTO->dt_inicio);
            }
            
            if( isset($obTO->dt_final) and !empty($obTO->dt_final) ){
                $obSelect->where('distribuicao.dt_cadastro <?',$obTO->dt_final);
            }

            $obSelect->order( array( "tipo_produto.no_tipo_produto ASC", "distribuicao.dt_cadastro ASC ") );
            
            return $this->getAdapter()->fetchAll($obSelect);
        }  

    
        public function listarRelatorioUnidadeProdutoDistribuicao(Voitech_TO $obTO){
            
            $obSelect = $this->getAdapter()->select()
                                              ->from(array('item_distribuicao'=>'item_distribuicao'))
                                              ->columns(array("co_produto"=>"produto.co_produto"
                                                             ,"co_tipo_produto"=>"produto.co_tipo_produto"
                                                             ,"co_categoria"=>"produto.co_categoria"
                                                             ,"co_unidade"=>"unidade.co_unidade"
                                                             ,"no_unidade"=>"unidade.no_unidade"
                                                             ,"no_tipo_produto"=>"tipo_produto.no_tipo_produto"
                                                             ,"no_produto"=>"produto.no_produto"
                                                             ,"no_categoria"=>"categoria.no_categoria"
                                                             ,"nu_quantidade_produto"=>"item_distribuicao.nu_quantidade_atendida"
                                                             ,"dt_cadastro"=>"distribuicao.dt_cadastro"
                                                             ))
                                              ->joinInner('distribuicao', "item_distribuicao.co_distribuicao = distribuicao.co_distribuicao",'') 
                                              ->joinInner('produto', "item_distribuicao.co_produto = produto.co_produto",'')
                                              ->joinInner('unidade', "distribuicao.co_unidade = unidade.co_unidade",'') 
                                              ->joinInner('categoria', "produto.co_categoria = categoria.co_categoria",'')              
                                              ->joinInner('tipo_produto', "produto.co_tipo_produto = tipo_produto.co_tipo_produto",'');
                                              
            if( isset($obTO->dt_inicio) and !empty($obTO->dt_inicio) ){
                $obSelect->where('distribuicao.dt_cadastro >?',$obTO->dt_inicio);
            }
            
            if( isset($obTO->dt_final) and !empty($obTO->dt_final) ){
                $obSelect->where('distribuicao.dt_cadastro <?',$obTO->dt_final);
            }

            $obSelect->order( array( "unidade.no_unidade ASC", "distribuicao.dt_cadastro ASC") );
            
            return $this->getAdapter()->fetchAll($obSelect);
        } 

        public function listarRelatorioPorProdutoDistribuicao(Voitech_TO $obTO){
            
            $obSelect = $this->getAdapter()->select()
                                              ->from(array('item_distribuicao'=>'item_distribuicao'))
                                              ->columns(array("co_produto"=>"produto.co_produto"
                                                             ,"co_tipo_produto"=>"produto.co_tipo_produto"
                                                             ,"co_categoria"=>"produto.co_categoria"
                                                             ,"co_unidade"=>"unidade.co_unidade"
                                                             ,"no_unidade"=>"unidade.no_unidade"
                                                             ,"no_tipo_produto"=>"tipo_produto.no_tipo_produto"
                                                             ,"no_produto"=>"produto.no_produto"
                                                             ,"no_categoria"=>"categoria.no_categoria"
                                                             ,"nu_quantidade_produto"=>"item_distribuicao.nu_quantidade_atendida"
                                                             ,"dt_cadastro"=>"distribuicao.dt_cadastro"
                                                             ))
                                              ->joinInner('distribuicao', "item_distribuicao.co_distribuicao = distribuicao.co_distribuicao",'') 
                                              ->joinInner('produto', "item_distribuicao.co_produto = produto.co_produto",'')
                                              ->joinInner('unidade', "distribuicao.co_unidade = unidade.co_unidade",'') 
                                              ->joinInner('categoria', "produto.co_categoria = categoria.co_categoria",'')              
                                              ->joinInner('tipo_produto', "produto.co_tipo_produto = tipo_produto.co_tipo_produto",'');
                                              
            if( isset($obTO->dt_inicio) and !empty($obTO->dt_inicio) ){
                $obSelect->where('distribuicao.dt_cadastro >?',$obTO->dt_inicio);
            }
            
            if( isset($obTO->dt_final) and !empty($obTO->dt_final) ){
                $obSelect->where('distribuicao.dt_cadastro <?',$obTO->dt_final);
            }

            $obSelect->order( array( "produto.no_produto ASC", "distribuicao.dt_cadastro ASC") );
            
            return $this->getAdapter()->fetchAll($obSelect);
        }         
}